# encoding: utf-8
"""
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    created by lane.chang on '09/09/2024'
    comment: 服务流程model相关
"""
import ujson
import datetime
from pydantic import Field
from laner.pydantic import BaseModel
from typing import Union


class Component(BaseModel):
    """ 组件
    """
    title: str = Field('', title='组件名称')
    type: str = Field('display', title='组件类型', description='display(显示)/input(输入)')
    style: str = Field('', title='组件风格: button(按钮)')
    vertical: str = Field('', title='纵向位置', description='top(上)/center(中)/bottom(下)')
    horizontal: str = Field('', title='横向位置', description='left(左)/center(中)/right(右)')
    event: str = Field('', title='事件', description='/back(上一级)/next(下一级)/cancel(取消)')


class Group(BaseModel):
    """ 项目分组
    """
    title: str = Field('', title='组名')
    image_checked: str = Field('', title='组图片(选中)')
    image_unchecked: str = Field('', title='组图片(未选中)')


class Item(BaseModel):
    """
    """
    title: str = Field('', title='项目标题')
    content: str = Field('', title='项目说明')
    image: str = Field('', title='项目图片')
    count: int = Field(None, title='项目数量', description='如果为None, 则不显示数量')
    price: float = Field(None, title='项目单价', description='如果为None, 则不显示单价')
    detail: list = Field([], title='项目详情')
    group_title: str = Field('', title='组名称')
    link_node_code: str = Field('', title='链接节点编号')


class ItemResult(BaseModel):
    """
    """
    title: str = Field('', title='项目标题')
    value: str = Field('', title='项目值')
    type: str = Field('string', title='string(字符串)/total(合计)/list(列表)')
    bind_node_code: str = Field('', title='绑定的节点code')
    data_source: str = Field('', title='数据来源', description='node_selected(节点选择)/fixed_value(固定值)')
    is_title_hide: bool = Field(False, title='是否隐藏标题')
    location: str = Field('', title='项目位置', description='title(标题)/head(首行)/detail(明细)')


class Parameter(BaseModel):
    """
    """
    title: str = Field('', title='参数名称')
    description: str = Field('', title='参数描述')
    value_type: str = Field('', title='参数值类型')
    detail: Union[list, dict] = Field(None, title='参数信息')
    # is_required: bool = Field(False, title='是否必须')
    # type: # str = Field('', title='参数类型')
    # sample: str = Field('', title='参数样例')

    def ai_dict(self):
        """
        :return:
        """
        return {
            '参数名称': self.title,
            '参数描述': self.description,
            # '参数是否必须': self.is_required,
            # '参数值类型': self.type,
            # '参数样例': self.sample,
            self.title: self.detail
        }


class Node(BaseModel):
    """ 流程节点
    """
    code: str = Field('', title='节点编号')
    name: str = Field('', title='节点名称')
    index: int = Field(0, title='节点排序')
    title: str = Field('', title='节点标题')
    description: str = Field('', title='节点描述')
    image: str = Field('', title='节点icon')
    feedback: str = Field('', title='AI反馈')
    components: list[Component] = Field([], title='组件列表')
    parameter_titles: list = Field([], title='参数名称列表')
    last_node_code: str = Field('', title='上一节点编号')
    next_node_code: str = Field('', title='下一节点编号')
    groups: list[Group] = Field([], title='项目组列表')
    items: list[Item] = Field([], title='项目列表')
    item_results: list[Item] = Field([], title='结果列表')
    select_mode: str = Field('single', title='项目选择模式', description='single(单选)/multiple(多选)')
    is_sum: bool = Field(False, title='是否合计')
    type: str = Field('process', title='节点类型', description='process(中间页)/confirm(确认页)/closing_page(结束页)')


class Flow(BaseModel):
    """ 服务流程
    """
    code: str = Field('', title='编号')
    title: str = Field('', title='名称')
    image: str = Field('', title='图片')
    description: str = Field('', title='流程描述')
    matching_intent: str = Field('', title='用户意图描述')
    sop: str = Field('', title='SOP描述')
    parameters: list = Field([], title='服务流程参数列表')
    nodes: list[Node] = Field([], title='节点列表')
    samples: list = Field([], title='话术样例')

    def service_agent_desc(self):
        """
        :return:
        """
        return f'服务名称: {self.title}。服务描述: {self.description}。'

    def sample_agent_desc(self):
        """
        :return:
        """
        return [f'用户对你说："{v}"。你判断用户需要的服务名称：<name>{self.title}</name>' for v in self.samples if v]

    def dict(self, *args, **kwargs) -> dict:
        """
        :param args:
        :param kwargs:
        :return:
        """
        result = super(Flow, self).dict(*args, **kwargs)

        return result


# 清洗服务
def get_laundry_service():
    """
    :return:
    """
    sop = """首先会询问对方什么时候上门取衣物，比如："您希望几点收取衣物呢？"，对应节点"node_001"。
    接着等待对方回答上门取衣服的时间，对方回答时间后，告知对方已为对方生成预约清洗的订单，并询问对方是否确认下单，比如："好的，已为您生成预约清洗订单，请核对后，点击或和我说“确认下单”"，对应节点"node_002"。
    对方确认下单后，告知对方已为对方预约，稍候安排服务人员上门收取衣物，请对方耐心等待，比如："已为您预约，稍后安排服务人员上门收取衣物，请耐心等待"，对应节点"node_003"
        """
    laundry_service = {
        'code': 'flow_01',
        'title': '衣物清洗',
        'image': 'https://roboland-ai.oss-cn-shenzhen.aliyuncs.com/assichat/icon/room_cleaning.png',
        'description': '为用户提供的衣物清洗服务',
        'matching_intent': '用户想预约衣物清洗',
        'samples': ['我有一些脏衣服想洗洗'],
        'sop': sop,
        'parameters': [
            {
                'title': '上门收衣服时间',
                'description': '老人提出的上门收衣服的时间',
                'is_required': True,
                'type': 'string',
                'sample': '08:00~09:00'
            }
        ],
        'nodes': [
            {
                'index': 0,
                'code': 'node_001',
                'name': '选择收取衣物时间页面',
                'title': '【衣物清洗】选择收取衣物时间页面',
                'image': 'https://roboland-ai.oss-cn-shenzhen.aliyuncs.com/assichat/icon/time.png',
                'description': '让用户选择收取衣物的时间',
                'digital': '',
                'feedback': ['我选择的上门收衣服时间是{上门收衣服时间}'],
                'digital_human': '您好，欢迎使用衣物清洗服务，您希望几点收取衣物呢？',
                'components': [
                    {'title': '< 返回', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'left', 'event': 'back'},
                    {'title': '确定', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'right', 'event': 'next'},
                ],
                'parameter_titles': ['上门收衣服时间'],
                'items': [
                    {'title': '08:00~09:00'},
                    {'title': '09:00~10:00'},
                    {'title': '10:00~11:00'},
                    {'title': '11:00~12:00'},
                    {'title': '12:00~13:00'},
                    {'title': '13:00~14:00'},
                    {'title': '14:00~15:00'},
                    {'title': '15:00~16:00'},
                    {'title': '16:00~17:00'},
                ],
                'type': 'process',
                'next_node_code': 'node_002'
            },
            {
                'index': 1,
                'code': 'node_002',
                'name': '服务订单确认页面',
                'title': '请核对您的服务订单',
                'description': '让用户核对服务订单',
                'feedback': ['是的, 确认下单'],
                'digital_human': '以下是您的预约清洗订单，请核对后，点击“确认下单”',
                'components': [
                    {'title': '< 返回', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'left', 'event': 'back'},
                    {'title': '确认下单', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'right', 'event': 'next'},
                ],
                'parameter_titles': ['上门收衣服时间'],
                'item_results': [
                    {'title': '服务地址', 'value': '5栋909', 'type': 'string', 'data_source': 'fixed_value', 'location': 'detail'},
                    {'title': '服务时间', 'value': '', 'type': 'string', 'data_source': 'node_selected', 'location': 'detail', 'bind_node_code': 'node_001'},
                    {'title': '服务项目', 'value': '衣物清洗', 'type': 'string', 'data_source': 'fixed_value', 'location': 'detail'}
                ],
                'type': 'confirm',
                'last_node_code': 'node_001',
                'next_node_code': 'node_003'
            },
            {
                'index': 2,
                'code': 'node_003',
                'name': '服务订单预约成功结果页面',
                'title': '您的衣物清洗服务已预约成功',
                'digital_human': '核对后，点击“确认下单”按钮"',
                'image': 'https://roboland-ai.oss-cn-shenzhen.aliyuncs.com/assichat/icon/time.png',
                'description': '给用户展示预约成功结果',
                'components': [
                    {'title': '< 返回', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'left', 'event': 'back'},
                    {'title': '取消预约', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'right', 'event': 'cancel'},
                ],
                'item_results': [
                    {'title': '服务地址', 'value': '5栋909', 'type': 'string', 'data_source': 'fixed_value', 'location': 'title'},
                    {'title': '服务时间', 'value': '', 'type': 'string', 'data_source': 'node_selected', 'location': 'title', 'bind_node_code': 'node_001'},
                    {'title': '服务项目', 'value': '衣物清洗', 'type': 'string', 'data_source': 'fixed_value', 'location': 'detail', 'is_title_hide': True}
                ],
                'type': 'closing_page',
                'last_node_code': 'node_002'
            }
        ]
    }

    return laundry_service


# 订餐服务
def get_food_ordering_service():
    """ 订餐服务
    :return:
    """
    def _get_node_001():
        """
        :return:
        """
        node = {
                'index': 0,
                'code': 'node_001',
                'name': '点餐服务选购',
                'title': '早餐',
                'description': '用户表达了点餐意愿，你需要提醒用户选择菜品',
                'feedback': ["我预订了这些餐食：{预订的餐食列表}"],
                'digital_human': '您好，欢迎使用怡养智能送餐服务，以下是餐厅的自选菜单，请选购',
                'components': [
                    {'title': '< 返回', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'left', 'event': 'back'},
                    {'title': '去下单', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'right', 'event': 'next'},
                ],
                'parameter_titles': ['预订的餐食列表'],
                'items': [
                    {'title': '豆浆+油条', 'image': '', 'count': 0, 'price': 8.00},
                    {'title': '馒头', 'image': '', 'count': 0, 'price': 4.00},
                    {'title': '小米粥', 'image': '', 'count': 0, 'price': 2.00},
                    {'title': '燕麦粥', 'image': '', 'count': 0, 'price': 6.00},
                    {'title': '阳春面', 'image': '', 'count': 0, 'price': 10.00},
                    {'title': '小笼包(一屉3个)', 'image': '', 'count': 0, 'price': 10.00}
                ],
                'type': 'process',
                'next_node_code': 'node_002',
                'select_mode': 'multiple',
                'is_sum': True
        }

        now_time = datetime.datetime.now().strftime('%H%M%S')
        if '090000' <= now_time <= '135959':
            node['title'] = '午餐'
            node['items'] = [
                {'title': '蒜香炒肉丝', 'image': '', 'count': 0, 'price': 5.00},
                {'title': '黄豆炖猪抓', 'image': '', 'count': 0, 'price': 8.00},
                {'title': '红烧鸡腿', 'image': '', 'count': 0, 'price': 8.00},
                {'title': '生煸菠菜', 'image': '', 'count': 0, 'price': 3.00},
                {'title': '虾仁豆腐', 'image': '', 'count': 0, 'price': 15.00},
                {'title': '小白菜', 'image': '', 'count': 0, 'price': 3.00}
            ]
        elif '140000' <= now_time <= '185959':
            node['title'] = '晚餐'
            node['items'] = [
                {'title': '粉蒸鸡块', 'image': '', 'count': 0, 'price': 8.00},
                {'title': '红烧土豆', 'image': '', 'count': 0, 'price': 3.00},
                {'title': '生菜', 'image': '', 'count': 0, 'price': 3.00},
                {'title': '香干肉丝', 'image': '', 'count': 0, 'price': 5.00},
                {'title': '苦瓜', 'image': '', 'count': 0, 'price': 3.00},
                {'title': '双色花菜', 'image': '', 'count': 0, 'price': 3.00}
            ]

        return node

    def _get_node_002():
        node = {
                'index': 1,
                'code': 'node_002',
                'name': '选择上门送餐时间页面',
                'title': '【订餐服务】选择配送时间段',
                'image': 'https://roboland-ai.oss-cn-shenzhen.aliyuncs.com/assichat/icon/time.png',
                'description': '让用户选择送餐时段',
                'feedback': ["我选择的订餐配送时间段是{预约送餐时间段}"],
                'digital_human': '您好，您希望几点送餐到您房间呢？请选择配送时间段。',
                'components': [
                    {'title': '< 返回', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'left', 'event': 'back'},
                    {'title': '确定', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'right', 'event': 'next'},
                ],
                'parameter_titles': ['预约送餐时间段'],
                'items': [
                    {'title': '06:00~07:00'},
                    {'title': '07:00~08:00'},
                    {'title': '08:00~09:00'}
                ],
                'type': 'process',
                'last_node_code': 'node_001',
                'next_node_code': 'node_003'
            }

        now_time = datetime.datetime.now().strftime('%H%M%S')
        if '090000' <= now_time <= '135959':
            node['items'] = [
                {'title': '09:00~10:00'},
                {'title': '10:00~11:00'},
                {'title': '11:00~12:00'},
                {'title': '12:00~13:00'},
                {'title': '13:00~14:00'}
            ]
        elif '140000' <= now_time <= '185959':
            node['items'] = [
                {'title': '16:00~17:00'},
                {'title': '17:00~18:00'},
                {'title': '18:00~19:00'}
            ]

        return node

    sop = """
1）首先如果用户表达了想点餐的意愿，则告知用户欢迎语并提醒用户自选菜品，比如："您好，欢迎使用怡养智能送餐服务，以下是餐厅的自选菜单，请选购"，对应节点"node_001",；
2）用户选择要选购的残段、餐食后，点击“去下单”按钮后，接着你会询问对方什么时候送餐方便，比如："您希望几点送餐到您房间呢？请选择配送时间段。"，对应节点"node_002",；
3）接着等对方告知或选择送餐上门的时间后，告知对方已为对方生成预约订餐的订单，并询问对方是否确认下单，比如："已为您生成订单，请核对清楚后，点击“确认下单”点击或和我说“确认下单”"，对应节点"node_003"；
4）对方表达订单信息无误或者回复确认下单的意思后，告知已为用户下单，请对方耐心等待，比如："已为您下单，请耐心等待"，对应节点"node_004"；
    """
    food_ordering_service = {
        'code': 'flow_02',
        'title': '订餐服务',
        'image': 'https://roboland-ai.oss-cn-shenzhen.aliyuncs.com/assichat/icon/time.png',
        'description': '为用户提供的送餐服务',
        'matching_intent': '用户想预订餐食送上门，比如预订早餐、中餐、晚餐然后送进房间。用户饿了想要吃点东西。',
        'samples': ['我肚子饿了'],
        'sop': sop,
        'parameters': [
            {
                'title': '预约送餐时间段',
                'description': '用户选择的送餐时间',
                'is_required': True,
                'type': 'string',
                'sample': '08:00~09:00'
            },
            {
                'title': '预订的餐食列表',
                'description': '用户期望预定的餐食列表',
                'is_required': True,
                'type': 'list',
                'sample': "[\"{\"馒头\",\"2\"}\"，\"{\"阳春面\",\"1\"}\"]",
            }
        ],
        'nodes': [
            _get_node_001(),
            _get_node_002(),
            {
                'index': 2,
                'code': 'node_003',
                'name': '订单确认页面',
                'title': '请核对您的服务订单',
                'feedback': ["是的，确认下单"],
                'description': '让用户核对订餐订单',
                'digital_human': '已为您生成订单，请核对清楚后，点击“确认下单”点击或和我说“确认下单"',
                'components': [
                    {'title': '< 返回', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'left', 'event': 'back'},
                    {'title': '确认下单', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'right', 'event': 'next'},
                ],
                'item_results': [
                    {'title': '服务时间', 'value': '', 'type': 'string', 'data_source': 'node_selected', 'location': 'head', 'bind_node_code': 'node_002'},
                    {'title': '服务地址', 'value': '5栋909', 'type': 'string', 'data_source': 'fixed_value', 'location': 'head'},
                    {'title': '选择项目', 'value': '', 'type': 'list', 'data_source': 'node_selected', 'location': 'detail', 'bind_node_code': 'node_001', 'is_title_hide': True}
                ],
                'type': 'confirm',
                'last_node_code': 'node_002',
                'next_node_code': 'node_004',
                'is_sum': True
            },
            {
                'index': 3,
                'code': 'node_004',
                'name': '订餐服务预约成功结果页面',
                'title': '您的早餐已预定成功',
                'description': '给用户展示预约成功结果',
                'digital_human': '已为您下单，请耐心等待',
                'image': 'https://roboland-ai.oss-cn-shenzhen.aliyuncs.com/assichat/icon/time.png',
                'components': [
                    {'title': '< 返回', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'left', 'event': 'back'},
                    {'title': '取消', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'right', 'event': 'cancel'},
                ],
                'item_results': [
                    {'title': '总金额', 'value': '', 'type': 'total', 'data_source': 'node_selected', 'location': 'title', 'bind_node_code': 'node_001'},
                    {'title': '服务地址', 'value': '5栋909', 'type': 'string', 'data_source': 'fixed_value', 'location': 'title'},
                    {'title': '服务时间', 'value': '', 'type': 'string', 'data_source': 'node_selected', 'location': 'title', 'bind_node_code': 'node_002'},
                    {'title': '选择项目', 'value': '', 'type': 'list', 'data_source': 'node_selected', 'location': 'detail', 'bind_node_code': 'node_001', 'is_title_hide': True}
                ],
                'type': 'closing_page',
                'last_node_code': 'node_003'
            }
        ]
    }

    return food_ordering_service


# 维修服务
def get_repair_service():
    """
    :return:
    """
    sop = """1）首先，如果用户一开场就表达了具体的希望维修的物品，则会与用户确认你理解的物品是否有误，比如："您是需要维修电视吗？", 对应节点",node_001",；
2）如果用户开场只是表达想报修，而没有提到具体物品，则你需要询问用户想修理什么物品，比如：",请问您想报修什么物品？",，对应节点",node_002",；
3）在用户完成了具体希望维修的物品并确认后，接着你会询问对方什么时候上门维修方便，比如：",您希望几点上门维修呢？请选择预约维修时间段。",，对应节点"node_003",；
4）接着等对方告知或选择上门维修的时间后，告知对方已为对方生成预约维修的订单，并询问对方是否确认下单，比如：",好的，已为您生成预约维修订单，请核对后，点击或和我说“确认下单”"，对应节点"node_004"；
5）对方表达订单信息无误或者回复确认下单的意思后，告知对方已为对方预约，稍候安排工作人员上门维修，请对方耐心等待，比如："已为您预约，稍后安排工作人员上门维修，请耐心等待"，对应节点"node_005"；
    """
    repair_service = {
        'code': 'flow_03',
        'title': '维修服务',
        'image': 'https://roboland-ai.oss-cn-shenzhen.aliyuncs.com/assichat/icon/time.png',
        'description': '为住户提供房屋内的设施设备维修服务',
        'matching_intent': '用户需要维修房屋里的设施设备',
        'samples': ['我房间空调一直不降温'],
        'sop': sop,
        'parameters': [
            {
                'title': '预约维修时间段',
                'description': '用户选择的送餐时间',
                'is_required': True,
                'type': 'string',
                'sample': '08:00~09:00'
            },
            {
                'title': '期望维修设施设备列表',
                'description': '用户期望维修的设施设备列表',
                'is_required': True,
                'type': 'string',
                'sample': '"[\"空调\"，\"窗帘\"]"'
            }
        ],
        'nodes': [
            {
                'index': 0,
                'code': 'node_001',
                'name': '维修需求澄清与追问页面',
                'title': '您是否需要电视维修呢',
                'description': '用户表达了维修某些设施设备的意愿，你需要与用户确认是否是需要维修用户提到的设施设备',
                'feedback': ["是的", "不是"],
                'parameter_titles': ['期望维修设施设备列表'],
                'items': [
                    {'title': '否', 'image': '', 'link_node_code': 'node_002'},
                    {'title': '是', 'image': '', 'link_node_code': 'node_003'}
                ],
                'type': 'process',
                'select_mode': 'single'
            },
            {
                'index': 1,
                'code': 'node_002',
                'name': '选择维修物品界面',
                'title': '选择您要维修的物品',
                'image': 'https://roboland-ai.oss-cn-shenzhen.aliyuncs.com/assichat/icon/time.png',
                'description': '让用户选择要维修的物品',
                'digital_human': '您好，请选择您需要的维修服务',
                'feedback': ["我想报修{期望维修设施设备列表}"],
                'components': [
                    {'title': '< 返回', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'left', 'event': 'back'},
                    {'title': '取下单', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'right', 'event': 'next'},
                ],
                'parameter_titles': ['期望维修设施设备列表'],
                'items': [
                    {'title': '桌子'},
                    {'title': '椅子'},
                    {'title': '床'},
                    {'title': '洗衣机'},
                    {'title': '空调'},
                    {'title': '抽油烟机'},
                    {'title': '电视机'}
                ],
                'last_node_code': 'node_001',
                'next_node_code': 'node_003',
                'type': 'process',
                'select_mode': 'multiple'
            },
            {
                'index': 2,
                'code': 'node_003',
                'name': '选择上门维修时间页面',
                'title': '【维修服务】选择上门时间段',
                'image': 'https://roboland-ai.oss-cn-shenzhen.aliyuncs.com/assichat/icon/time.png',
                'description': '让用户选择维修时段',
                'digital_human': '您好，请选择预约维修时段',
                'feedback': ['我选择的预约维修时段是{预约维修时段}'],
                'components': [
                    {'title': '< 返回', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'left', 'event': 'back'},
                    {'title': '确定', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'right', 'event': 'next'},
                ],
                'parameter_titles': ['预约维修时间段'],
                'items': [
                    {'title': '08:00~09:00'},
                    {'title': '09:00~10:00'},
                    {'title': '10:00~11:00'},
                    {'title': '11:00~12:00'},
                    {'title': '12:00~13:00'},
                    {'title': '13:00~14:00'},
                    {'title': '14:00~15:00'},
                    {'title': '15:00~16:00'},
                    {'title': '16:00~17:00'},
                ],
                'type': 'process',
                'last_node_code': 'node_002',
                'next_node_code': 'node_004'
            },
            {
                'index': 3,
                'code': 'node_004',
                'name': '维修服务订单确认页面',
                'title': '请核对您的服务订单',
                'description': '让用户核对服务订单',
                'feedback': ['是的, 确认下单'],
                'digital_human': '已为您生成维修订单，核对清楚后，点击“确认下单”按钮',
                'components': [
                    {'title': '< 返回', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'left', 'event': 'back'},
                    {'title': '确认下单', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'right', 'event': 'next'},
                ],
                'parameter_titles': ['上门收衣服时间'],
                'item_results': [
                    {'title': '服务地址', 'value': '5栋909', 'type': 'string', 'data_source': 'fixed_value', 'location': 'detail'},
                    {'title': '服务时间', 'value': '', 'type': 'string', 'data_source': 'node_selected', 'location': 'detail', 'bind_node_code': 'node_003'},
                    {'title': '服务项目', 'value': '', 'type': 'string', 'data_source': 'node_selected', 'location': 'detail', 'bind_node_code': 'node_002'}
                ],
                'type': 'confirm',
                'last_node_code': 'node_003',
                'next_node_code': 'node_005'
            },
            {
                'index': 4,
                'code': 'node_005',
                'name': '维修服务预约成功结果页面',
                'title': '您的维修服务已预约成功',
                'image': 'https://roboland-ai.oss-cn-shenzhen.aliyuncs.com/assichat/icon/time.png',
                'description': '给用户展示预约成功结果',
                'digital_human': '已为您下单，请耐心等待',
                'components': [
                    {'title': '< 返回', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'left', 'event': 'back'},
                    {'title': '取消预约', 'style': 'button', 'vertical': 'bottom', 'horizontal': 'right', 'event': 'cancel'},
                ],
                'item_results': [
                    {'title': '服务地址', 'value': '5栋909', 'type': 'string', 'data_source': 'fixed_value', 'location': 'title'},
                    {'title': '服务时间', 'value': '', 'type': 'string', 'data_source': 'node_selected', 'location': 'title', 'bind_node_code': 'node_001'},
                    {'title': '服务项目', 'value': '', 'type': 'string', 'data_source': 'node_selected', 'location': 'detail', 'bind_node_code': 'node_002', 'is_title_hide': True}
                ],
                'type': 'closing_page',
                'last_node_code': 'node_004'
            }
        ]
    }
    return repair_service


def init_flows() -> list[Flow]:
    """ 服务流程初始化
    :return:
    """
    flows = list()
    # 清洗衣服
    laundry_service = get_laundry_service()
    flows.append(Flow(**laundry_service))

    # 订餐服务
    food_ordering_service = get_food_ordering_service()
    flows.append(Flow(**food_ordering_service))

    # 维修服务
    repair_service = get_repair_service()
    flows.append(Flow(**repair_service))

    return flows


if __name__ == '__main__':
    """
    """
    result = init_flows()

    print(ujson.dumps(result, ensure_ascii=False, indent=4))


